package pe.gob.mininter.dirandro.vaadin.panel.busqueda;

import java.util.Date;
import java.util.List;

import org.apache.commons.lang.StringUtils;

import pe.gob.mininter.dirandro.model.DetExpedientePersona;
import pe.gob.mininter.dirandro.model.DetPerTelExp;
import pe.gob.mininter.dirandro.model.Expediente;
import pe.gob.mininter.dirandro.model.ModeloMarca;
import pe.gob.mininter.dirandro.model.Numero;
import pe.gob.mininter.dirandro.model.Opcion;
import pe.gob.mininter.dirandro.model.Persona;
import pe.gob.mininter.dirandro.model.Telefono;
import pe.gob.mininter.dirandro.model.Valor;
import pe.gob.mininter.dirandro.service.ExpedienteTelefonoService;
import pe.gob.mininter.dirandro.service.ModeloMarcaService;
import pe.gob.mininter.dirandro.service.TelefonoService;
import pe.gob.mininter.dirandro.util.Constante;
import pe.gob.mininter.dirandro.util.HarecUtil;
import pe.gob.mininter.dirandro.vaadin.util.ComboBoxLOVS;
import pe.gob.mininter.dirandro.vaadin.util.DirandroComponent;
import pe.gob.mininter.dirandro.vaadin.util.Injector;

import com.vaadin.annotations.AutoGenerated;
import com.vaadin.data.Item;
import com.vaadin.data.Property;
import com.vaadin.data.Property.ValueChangeEvent;
import com.vaadin.data.util.BeanItemContainer;
import com.vaadin.data.util.IndexedContainer;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.ComboBox;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Label;
import com.vaadin.ui.PopupDateField;
import com.vaadin.ui.Table;
import com.vaadin.ui.TextField;
import com.vaadin.ui.VerticalLayout;


public class PanelBuscarTelefono extends DirandroComponent {

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
	
	@AutoGenerated
	private VerticalLayout mainLayout;
	@AutoGenerated
	private VerticalLayout pnlPrincipal;
	@AutoGenerated
	private Table tblTelefonos;
	@AutoGenerated
	private HorizontalLayout horizontalLayout_3;
	@AutoGenerated
	private Button btnLimpiar;
	@AutoGenerated
	private Button btnBuscar;
	@AutoGenerated
	private HorizontalLayout horizontalLayout_2;
	@AutoGenerated
	private PopupDateField dtFecFinal;
	@AutoGenerated
	private PopupDateField dtFecInicial;
	@AutoGenerated
	private Label lblFechas;
	@AutoGenerated
	private HorizontalLayout horizontalLayout_1;
	@AutoGenerated
	private ComboBoxLOVS cmbOperadora;
	@AutoGenerated
	private ComboBox cmbModelo;
	@AutoGenerated
	private ComboBox cmbMarca;
	@AutoGenerated
	private TextField txtNumero;
	private static final long serialVersionUID = -6241989533669580659L;
	private TelefonoService telefonoService;
	private ModeloMarcaService modeloMarcaService;
	private ExpedienteTelefonoService expTelefonoService;
	
	private IndexedContainer container;
	private List<DetPerTelExp> lstExpTelefonos;
	
	/**
	 * The constructor should first build the main layout, set the
	 * composition root and then do any custom initialization.
	 *
	 * The constructor will not be automatically regenerated by the
	 * visual editor.
	 */
	public PanelBuscarTelefono(List<Opcion> acciones, String height) {
		super(acciones, height);
		buildMainLayout();
		telefonoService = Injector.obtenerServicio(TelefonoService.class);
		modeloMarcaService = Injector.obtenerServicio(ModeloMarcaService.class);
		expTelefonoService = Injector.obtenerServicio(ExpedienteTelefonoService.class);
		 
		setCompositionRoot(mainLayout);
		postConstruct();
		debugId();
	}
	
	private void debugId(){
		
	}
	
	public void postConstruct() {	
		
		cmbOperadora.setInputPrompt("Operadora");
		cmbOperadora.setCodigoLista(Constante.LISTA.CODIGO.OPERADORA);
		
		inicalizaTabla();
		cargarTiposComunicaciones();
		btnBuscar.addListener( new ClickListener() {
			
			@Override
			public void buttonClick(ClickEvent event) {
				buscar();
			}
		});
		
		btnLimpiar.addListener(new ClickListener() {
			
			@Override
			public void buttonClick(ClickEvent event) {
				limpiar();
			}
		});
		
	}
	
	private void cargarTiposComunicaciones() {
		List<ModeloMarca> lstTiposEquipos = modeloMarcaService.buscarHijos(new ModeloMarca(Constante.MODELO_MARCA.COMUNICACIONES.COD_COMUNICACION));
		cmbMarca.setContainerDataSource(new BeanItemContainer<ModeloMarca>(ModeloMarca.class,  lstTiposEquipos));
		cmbMarca.setItemCaptionPropertyId("nombre");
		cmbMarca.setImmediate(true);
		cmbMarca.addListener(new Property.ValueChangeListener() {            
			
			private static final long serialVersionUID = -5023884380372631373L;

			@Override
            public void valueChange(ValueChangeEvent event) {
				if (cmbMarca.getValue() != null) {
					cmbModelo.setContainerDataSource(new BeanItemContainer<ModeloMarca>(ModeloMarca.class, modeloMarcaService.buscarHijos((ModeloMarca) cmbMarca.getValue()) ));
					cmbModelo.setItemCaptionPropertyId("nombre");
				}
            }
        });
	}
	
	private void inicalizaTabla()	{
		container = new IndexedContainer();
		container.addContainerProperty("id", Long.class,  null);
		container.addContainerProperty("implicado", DetExpedientePersona.class, null);
		container.addContainerProperty("propietario", Persona.class, null);
		container.addContainerProperty("implicado.nombre", String.class, null);
		container.addContainerProperty("operadora", Valor.class, null);
		container.addContainerProperty("operadora.id", Long.class, null);
		container.addContainerProperty("operadora.nombre", String.class, null);
		container.addContainerProperty("situacion", Valor.class, null);
		container.addContainerProperty("situacion.id", Long.class, null);
		container.addContainerProperty("situacion.nombre", String.class, null);
		container.addContainerProperty("estado", Valor.class, null);
		container.addContainerProperty("estado.id", Long.class, null);
		container.addContainerProperty("estado.nombre", String.class, null);
		container.addContainerProperty("equipo", Telefono.class, null);
		container.addContainerProperty("numero", Numero.class, null);
		container.addContainerProperty("numero.numero", String.class, null);
		container.addContainerProperty("observacion", String.class, null);
		
		tblTelefonos.setContainerDataSource(container);
		tblTelefonos.setVisibleColumns(new Object[]{"id","implicado.nombre","operadora.nombre","numero.numero","situacion.nombre","estado.nombre"});

		tblTelefonos.setColumnHeader("id", "Id");
		tblTelefonos.setColumnHeader("implicado.nombre", "Persona Implicada");
		tblTelefonos.setColumnHeader("operadora.nombre", "Operadora");
		tblTelefonos.setColumnHeader("numero.numero", "Número");
		tblTelefonos.setColumnHeader("situacion.nombre", "Situacion");
		tblTelefonos.setColumnHeader("estado.nombre", "Estado");
		
	}
	
	private void cargaTabla(){
		if( lstExpTelefonos != null){
			tblTelefonos.removeAllItems();
			int con=1;
			for (DetPerTelExp expTelefono : lstExpTelefonos){
				Item item = container.addItem(con++);
				item.getItemProperty("id").setValue(expTelefono.getId());
				item.getItemProperty("implicado").setValue(expTelefono.getImplicado());
				item.getItemProperty("propietario").setValue(expTelefono.getPropietario());
				item.getItemProperty("implicado.nombre").setValue(expTelefono.getImplicado()!=null?expTelefono.getImplicado().getNombreCompleto():StringUtils.EMPTY);
				item.getItemProperty("operadora.id").setValue(expTelefono.getOperadora() != null ? expTelefono.getOperadora().getId() : null);
				item.getItemProperty("operadora.nombre").setValue(expTelefono.getOperadora() != null ? expTelefono.getOperadora().getNombre() : null);
				item.getItemProperty("situacion.id").setValue(HarecUtil.valorIdToEmpty( expTelefono.getSituacion()));
				item.getItemProperty("situacion.nombre").setValue(HarecUtil.valorNombreToEmpty(expTelefono.getSituacion()));
				item.getItemProperty("estado.id").setValue(HarecUtil.valorIdToEmpty(expTelefono.getEstado()));
				item.getItemProperty("estado.nombre").setValue(HarecUtil.valorNombreToEmpty(expTelefono.getEstado()));
				item.getItemProperty("equipo").setValue(expTelefono.getEquipo());
				item.getItemProperty("numero.numero").setValue(HarecUtil.numeroToEmpty(expTelefono.getNumeroTelefonico()));
				item.getItemProperty("observacion").setValue(HarecUtil.nullToEmpty( expTelefono.getObservacion() ));
			}
		}
	}
	
	private void buscar(){
		DetPerTelExp det = new DetPerTelExp();
		det.setOperadora( cmbOperadora.getValor() );
		
		Telefono tel = new Telefono();
		tel.setMarca( (ModeloMarca)cmbModelo.getValue() );
		det.setEquipo(tel);
		
		Expediente exp = new Expediente();
		exp.setFechaRegistro((Date)dtFecInicial.getValue());
		exp.setFechaRegistroFinal((Date)dtFecFinal.getValue());
		det.setExpediente(exp);
		
		Numero num = new Numero();
		num.setNumero(HarecUtil.nullToEmpty(txtNumero.getValue()));
		det.setNumeroTelefonico( num );
		
		lstExpTelefonos = expTelefonoService.buscar( det );
		
		cargaTabla();
	}
	
	private void limpiar(){
		txtNumero.setValue("");
		cmbMarca.setValue(null);
		cmbModelo.setValue(null);
		dtFecFinal.setValue(null);
		dtFecInicial.setValue(null);
		cmbOperadora.setValue(null);
	}
	
	@AutoGenerated
	private VerticalLayout buildMainLayout() {
		// common part: create layout
		mainLayout = new VerticalLayout();
		mainLayout.setImmediate(false);
		mainLayout.setWidth("100%");
		mainLayout.setHeight("-1px");
		mainLayout.setMargin(false);
		
		// top-level component properties
		setWidth("100.0%");
		setHeight("-1px");
		
		// pnlPrincipal
		pnlPrincipal = buildPnlPrincipal();
		mainLayout.addComponent(pnlPrincipal);
		mainLayout.setComponentAlignment(pnlPrincipal, new Alignment(20));
		
		return mainLayout;
	}

	@AutoGenerated
	private VerticalLayout buildPnlPrincipal() {
		// common part: create layout
		pnlPrincipal = new VerticalLayout();
		pnlPrincipal.setStyleName("whiteBackGround");
		pnlPrincipal.setImmediate(false);
		pnlPrincipal.setWidth("800px");
		pnlPrincipal.setHeight("-1px");
		pnlPrincipal.setMargin(true);
		pnlPrincipal.setSpacing(true);
		
		// horizontalLayout_1
		horizontalLayout_1 = buildHorizontalLayout_1();
		pnlPrincipal.addComponent(horizontalLayout_1);
		
		// horizontalLayout_2
		horizontalLayout_2 = buildHorizontalLayout_2();
		pnlPrincipal.addComponent(horizontalLayout_2);
		
		// horizontalLayout_3
		horizontalLayout_3 = buildHorizontalLayout_3();
		pnlPrincipal.addComponent(horizontalLayout_3);
		
		// tblTelefonos
		tblTelefonos = new Table();
		tblTelefonos.setImmediate(false);
		tblTelefonos.setWidth("800px");
		tblTelefonos.setHeight("350px");
		pnlPrincipal.addComponent(tblTelefonos);
		
		return pnlPrincipal;
	}

	@AutoGenerated
	private HorizontalLayout buildHorizontalLayout_1() {
		// common part: create layout
		horizontalLayout_1 = new HorizontalLayout();
		horizontalLayout_1.setImmediate(false);
		horizontalLayout_1.setWidth("-1px");
		horizontalLayout_1.setHeight("-1px");
		horizontalLayout_1.setMargin(false);
		horizontalLayout_1.setSpacing(true);
		
		// txtNumero
		txtNumero = new TextField();
		txtNumero.setCaption("Número Telefónico:");
		txtNumero.setImmediate(false);
		txtNumero.setWidth("-1px");
		txtNumero.setHeight("-1px");
		txtNumero.setInputPrompt("Nro. de Teléfono");
		txtNumero.setMaxLength(12);
		horizontalLayout_1.addComponent(txtNumero);
		
		// cmbMarca
		cmbMarca = new ComboBox();
		cmbMarca.setCaption("Marca");
		cmbMarca.setImmediate(false);
		cmbMarca.setWidth("200px");
		cmbMarca.setHeight("-1px");
		horizontalLayout_1.addComponent(cmbMarca);
		
		// cmbModelo
		cmbModelo = new ComboBox();
		cmbModelo.setCaption("Modelo");
		cmbModelo.setImmediate(false);
		cmbModelo.setWidth("200px");
		cmbModelo.setHeight("-1px");
		horizontalLayout_1.addComponent(cmbModelo);
		
		// cmbOperadora
		cmbOperadora = new ComboBoxLOVS();
		cmbOperadora.setCaption("Operadora");
		cmbOperadora.setImmediate(false);
		cmbOperadora.setWidth("-1px");
		cmbOperadora.setHeight("-1px");
		horizontalLayout_1.addComponent(cmbOperadora);
		
		return horizontalLayout_1;
	}

	@AutoGenerated
	private HorizontalLayout buildHorizontalLayout_2() {
		// common part: create layout
		horizontalLayout_2 = new HorizontalLayout();
		horizontalLayout_2.setImmediate(false);
		horizontalLayout_2.setWidth("-1px");
		horizontalLayout_2.setHeight("-1px");
		horizontalLayout_2.setMargin(false);
		horizontalLayout_2.setSpacing(true);
		
		// lblFechas
		lblFechas = new Label();
		lblFechas.setImmediate(false);
		lblFechas.setWidth("150px");
		lblFechas.setHeight("-1px");
		lblFechas.setValue("Rango de Expediente:");
		horizontalLayout_2.addComponent(lblFechas);
		horizontalLayout_2.setComponentAlignment(lblFechas, new Alignment(48));
		
		// dtFecInicial
		dtFecInicial = new PopupDateField();
		dtFecInicial.setCaption("Fecha Inicial:");
		dtFecInicial.setImmediate(false);
		dtFecInicial.setWidth("150px");
		dtFecInicial.setHeight("-1px");
		dtFecInicial.setResolution(4);
		horizontalLayout_2.addComponent(dtFecInicial);
		
		// dtFecFinal
		dtFecFinal = new PopupDateField();
		dtFecFinal.setCaption("Fecha Final");
		dtFecFinal.setImmediate(false);
		dtFecFinal.setWidth("150px");
		dtFecFinal.setHeight("-1px");
		dtFecFinal.setResolution(4);
		horizontalLayout_2.addComponent(dtFecFinal);
		
		return horizontalLayout_2;
	}

	@AutoGenerated
	private HorizontalLayout buildHorizontalLayout_3() {
		// common part: create layout
		horizontalLayout_3 = new HorizontalLayout();
		horizontalLayout_3.setImmediate(false);
		horizontalLayout_3.setWidth("100.0%");
		horizontalLayout_3.setHeight("-1px");
		horizontalLayout_3.setMargin(false);
		
		// btnBuscar
		btnBuscar = new Button();
		btnBuscar.setCaption("Buscar");
		btnBuscar.setImmediate(true);
		btnBuscar.setWidth("-1px");
		btnBuscar.setHeight("-1px");
		horizontalLayout_3.addComponent(btnBuscar);
		horizontalLayout_3.setComponentAlignment(btnBuscar, new Alignment(6));
		
		// btnLimpiar
		btnLimpiar = new Button();
		btnLimpiar.setCaption("Limpiar");
		btnLimpiar.setImmediate(true);
		btnLimpiar.setWidth("-1px");
		btnLimpiar.setHeight("-1px");
		horizontalLayout_3.addComponent(btnLimpiar);
		
		return horizontalLayout_3;
	}	
	
	
	
	

}
